package syspizza.DAO;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import syspizza.pedido.Pedido;

public class PedidoDAO implements IDAO<Pedido> {

    //DEFINIR CAMINHO DOS ARQUIVOS     
    private final String PASTA = "\\SysPizza\\dados\\pedidos\\";
    private final String ARQUIVO = "pedidos.dat";

    @Override
    public boolean insert(Pedido pedido) {
        verificaPasta();
        List<Pedido> lista = getAll();
        int codigo = getNextId();
        pedido.setId(codigo);
        lista.add(pedido);
        try {
            write(lista);
        } catch (IOException ex) {
            return false;
        }
        return true;
    }

    @Override
    public boolean delete(int id) {
        List<Pedido> pedidos = getAll();
        boolean removido = pedidos.removeIf(s -> s.getId() == id);
        if (removido) {
            try {
                write(pedidos);
            } catch (IOException ex) {
                return false;
            }
        }
        return removido;
    }

    @Override
    public boolean update(Pedido ped) {
        List<Pedido> pedidos = getAll();
        Pedido p = null;

        for (Pedido pedido : pedidos) {
            if (pedido.getId() == ped.getId()) {
                p = pedido;
            }
        }
        if (p != null) {
            pedidos.remove(p);
            pedidos.add(ped);

            try {
                write(pedidos);
            } catch (IOException ex) {
                return false;
            }
            return true;
        }
        return false;
    }

    @Override
    public List<Pedido> getAll() {
        //pega a lista com todos os registros
        List<Pedido> pedidos = new ArrayList<>();
        verificaPasta();
        File[] arqs = new File(PASTA).listFiles();

        for (File file : arqs) {
            if (file.isFile()) {
                try {
                    FileInputStream fis = new FileInputStream(file);
                    ObjectInputStream ois = new ObjectInputStream(fis);
                    pedidos = (ArrayList<Pedido>) ois.readObject();

                    ois.close();
                    fis.close();
                } catch (FileNotFoundException ex) {
                    return pedidos;
                } catch (IOException | ClassNotFoundException ex) {
                    return pedidos;
                }
            }
        }
        return pedidos;
    }

    @Override
    public Pedido getById(int id) {
        List<Pedido> pedidos = getAll();
        for (Pedido pedido : pedidos) {
            if (pedido.getId() == id) {
                return pedido;
            }
        }
        return null;
    }

    @Override
    public int getNextId() {
        int id = 0;
        verificaPasta();
        List<Pedido> pedidos = getAll();
        for (Pedido pedido : pedidos) {
            if (pedido.getId() > id) {
                id = pedido.getId();
            }
        }
        id++;
        return id;
    }

    private boolean verificaPasta() {
        File arq = new File(PASTA);

        if (!arq.exists()) {
            arq.mkdirs();
        }
        return true;
    }

    public void write(List<Pedido> pedidos) throws FileNotFoundException, IOException {
        verificaPasta();
        File arq = new File(PASTA + ARQUIVO);
        try (FileOutputStream fos = new FileOutputStream(arq);
                ObjectOutputStream oos = new ObjectOutputStream(fos)) {
            oos.writeObject(pedidos);
        }
    }

    public List<Pedido> getByClienteNome(String nome) {

        List<Pedido> pedidos = getAll();
        
        if (!((nome.isEmpty()) || ("".equals(nome)) || nome == null)) {
            pedidos.removeIf(p -> !p.getCliente().toString().toUpperCase().contains(nome.toUpperCase()));
        }
        return pedidos;
    }

}
